"Les cours de neeko.fr"

Retour en haut

Android : Les Activities

Android : Les Activities

Déclarer, appeler, communiquer

L'Activity principale

Lorsque l'on crée un projet Android, l'Activity principale est crée et déclarée automatiquement :

Il est possible de créer autant d'Activity que l'on souhaite pour notre application, à condition de les déclarer dans le manifest.

Le Manifest à la création du projet :

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

L'élément interressant se trouve dans application

<activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

On trouve l'activity avec son nom complet (package + class) : com.example.MainActivity

On trouve aussi une balide intent-filter, contenant certaines options pour le système Android :

La plupart du temps, ces 2 options vont ensemble, mais ce n'est pas obligatoire.

Créer et déclarer une nouvelle Activity

On peut créer une nouvelle classe standard dérivant d'Activity, l' ajouter manuellement dans le manifest, mais Eclipse nous offre un moyen de le faire à notre place.

Il suffit donc de choisir File/new.../Android Activity et ensuite de se laisser guider par l'assistant (Blank Activity, puis Choisir le nom de la nouvelle Activity).

Après avoir validé cet écran, plusieurs fichiers ont été crées et modifiés par Eclipse:

Le manifest avec 2 activities :

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.example.AboutActivity" android:label="@string/title_activity_about" > </activity> </application> </manifest>

Activity et Intent

Pour communiquer entre plusieurs Activities de notre application ou celles d'autres applications, Android utilise le mécanisme d'Intent.

Ce système permet de lancer une autre Activity de notre application, ou de profiter des autres applications installées sur le terminal, comme par exemple la téléphonie, le navigateur internet, le carnet d'adresse, et bien s'autres.

Appeler directement une autre Activity de notre application

Chaque Activity possède une méthode startActivity qu'il faut appeller avec un objet intermédiare Intent.

Pour lancer une autre Activity de notre application, il suffit de préciser la classe de celle ci :

//lance l'activity AboutActivity Intent i = new Intent(this, AboutActivity.class); startActivity(i);

Ce code peut-être placé n'importe ou dans l'Activity appellante, dans le onCreate, ou dans un onClick par exemple.

Lorsque l'on crée un Intent, il faut oligatoirement lui passer l'Activity appellante (this).

Lorsque ce code est exécuté, la nouvelle Activity s'ouvre et se place "devant" l'autre. L'utilisateur peut alors utiliser le bouton "retour" de son terminal pour revenir à l'Activity précédente.

Demander à l'OS de résoudre notre demande

Depuis notre application, on peut avoir besoin d'utiliser des applications externes pour certains besoins. Le cas typique est l'utilisation du navigateur web ou du téléphone.

Plutot que demander à l'OS d'ouvrir un programme particulier, on demande à Android d'ouvrir une URI particulière.

Les URI

Une URI (Uniform Resource Identifier) représente un identifiant et un protocole :

Une addresse internet par exemple identifie un identifiant (le nom de domaine), et un protocole (http, la plupart du temps)

Android supporte aussi d'autres URI, comme par exemple mailto: ou tel:

Voici quelques exemples d'URI :

L'avantage de ce systeme c'est que l'application qui s'ouvre va dépendre de l'utilisateur. S'il n'y a qu'une seule application installée capable de gérer un protocole donné, elle sera lancée. S'il y en a plusieurs, c'est l'utilisateur qui choisira.

En plus de spécifier une URI, il faut spécifier une action sur cette URI. Souvent on utilise l'action Intent.ACTION_VIEW, mais d'autres actions sont disponibles (EDIT par exemple).

Par exemple pour afficher une page web :

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.fr")); startActivity(i);

ou pour composer un numéro de téléphone :

Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("tel:0661123456")); startActivity(i);

Plus d'infos : http://developer.android.com/guide/appendix/g-app-intents.html, http://developer.android.com/guide/components/intents-filters.html, http://www.vogella.com/articles/AndroidIntent/article.html.

Aller plus loin

Envoyer des données en lancant une Activity

Il est possible de passer des valeurs à destination de l'autre Activity :

Intent i = new Intent(this, AboutActivity.class); i.putExtra("Clé 1", "Une valeur"); i.putExtra("Clé 2", "Une autre valeur"); startActivity(i);

Et de les récupérer de l'autre côté, dans la méthode onCreate ...

Bundle extras = getIntent().getExtras(); if (extras == null) { return; } String myData = extras.getString("Clé 1"); if (myData != null) { System.out.println(myData); }

Recevoir des données en lancant une Activity

Avec la méthode startActivityForResult et la méthode onActivityResult.

Plus d'infos sur http://developer.android.com/reference/android/app/Activity.html#StartingActivities

TP

Cahier des charges :

Créer une application "MaCarteDeVisite" :

Etapes :